package com.ruoyi.ring.service.impl;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.ring.domain.dto.RingHeartRateInfoDTO;
import com.ruoyi.ring.domain.vo.RingHeartRateInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.ring.mapper.RingHeartRateInfoMapper;
import com.ruoyi.ring.domain.RingHeartRateInfo;
import com.ruoyi.ring.service.IRingHeartRateInfoService;

import javax.annotation.Resource;

/**
 * 心率信息Service业务层处理
 * 
 * @author liuwp
 * @date 2025-08-21
 */
@Slf4j
@Service
public class RingHeartRateInfoServiceImpl implements IRingHeartRateInfoService 
{
    @Resource
    private RingHeartRateInfoMapper ringHeartRateInfoMapper;

    /**
     * 查询心率信息
     * 
     * @param id 心率信息主键
     * @return 心率信息
     */
    @Override
    public RingHeartRateInfo selectRingHeartRateInfoById(Long id)
    {
        return ringHeartRateInfoMapper.selectRingHeartRateInfoById(id);
    }

    /**
     * 查询心率信息列表
     * 
     * @param ringHeartRateInfo 心率信息
     * @return 心率信息
     */
    @Override
    public List<RingHeartRateInfo> selectRingHeartRateInfoList(RingHeartRateInfo ringHeartRateInfo)
    {
        return ringHeartRateInfoMapper.selectRingHeartRateInfoList(ringHeartRateInfo);
    }

    /**
     * 根据业务主键查询一条记录：心率信息
     *
     * @param ringHeartRateInfo 心率信息
     * @return 心率信息
     */
    @Override
    public RingHeartRateInfo selectOneRingHeartRateInfo(RingHeartRateInfo ringHeartRateInfo)
    {
        return ringHeartRateInfoMapper.selectOneRingHeartRateInfo(ringHeartRateInfo);
    }

    /**
     * 新增心率信息
     * 
     * @param ringHeartRateInfo 心率信息
     * @return 结果
     */
    @Override
    public int insertRingHeartRateInfo(RingHeartRateInfo ringHeartRateInfo)
    {
        ringHeartRateInfo.setCreateTime(DateUtils.getNowDate());
        return ringHeartRateInfoMapper.insertRingHeartRateInfo(ringHeartRateInfo);
    }

    /**
     * 修改心率信息
     * 
     * @param ringHeartRateInfo 心率信息
     * @return 结果
     */
    @Override
    public int updateRingHeartRateInfo(RingHeartRateInfo ringHeartRateInfo)
    {
        ringHeartRateInfo.setUpdateTime(DateUtils.getNowDate());
        return ringHeartRateInfoMapper.updateRingHeartRateInfo(ringHeartRateInfo);
    }

    @Override
    public int updateRingHeartRateInfoCondition(RingHeartRateInfo ringHeartRateInfo, RingHeartRateInfo ringHeartRateInfoCondition)
    {
                ringHeartRateInfo.setUpdateTime(DateUtils.getNowDate());
        return ringHeartRateInfoMapper.updateRingHeartRateInfoCondition(ringHeartRateInfo, ringHeartRateInfoCondition);
    }

    /**
     * 批量删除心率信息
     * 
     * @param ids 需要删除的心率信息主键
     * @return 结果
     */
    @Override
    public int deleteRingHeartRateInfoByIds(Long[] ids)
    {
        return ringHeartRateInfoMapper.deleteRingHeartRateInfoByIds(ids);
    }

    /**
     * 删除心率信息信息
     * 
     * @param id 心率信息主键
     * @return 结果
     */
    @Override
    public int deleteRingHeartRateInfoById(Long id)
    {
        return ringHeartRateInfoMapper.deleteRingHeartRateInfoById(id);
    }

    /**
     * 条件删除心率信息
     *
     * @param ringHeartRateInfo 心率信息
     * @return 结果
     */
    @Override
    public int deleteRingHeartRateInfoByCondition(RingHeartRateInfo ringHeartRateInfo)
    {
        return ringHeartRateInfoMapper.deleteRingHeartRateInfoByCondition(ringHeartRateInfo);
    }

    @Override
    public RingHeartRateInfoVO queryRingHeartRateInfo(RingHeartRateInfoDTO heartRateInfoDTO) {
        String type = heartRateInfoDTO.getType();
        List<RingHeartRateInfo> list = ringHeartRateInfoMapper.queryRingHeartRateInfoList(heartRateInfoDTO);
        RingHeartRateInfoVO ringHeartRateInfoVO = new RingHeartRateInfoVO();
        long count = 0;//周和月 一共有多少个测量节点   后续看情况是否是全部节点
        long sum = 0;//计算所有总数
        if("1".equals(type) && list.size() > 0){
            RingHeartRateInfo heartRateInfo = list.get(0);
            String[] rateInfos = heartRateInfo.getHeartRateList().split(",");//转成String数组
            int[] rates = Stream.of(rateInfos).mapToInt(Integer::parseInt).toArray();//转成int数组
            ringHeartRateInfoVO.setAverageValue((int)Arrays.stream(rates).filter(num -> num != 0).average().orElse(0));
            List<RingHeartRateInfoVO.HeartRate> heartRateList = new ArrayList<>();
            for(int i = 0; i< rates.length; i++){
                int rate = rates[i];
                RingHeartRateInfoVO.HeartRate heartRate = new RingHeartRateInfoVO.HeartRate();
                // 计算当前时间（分钟）：初始0分钟，每次增加5分钟
                int minutes = i * heartRateInfo.getTimeInterval();
                // 格式化时间为HH:MM格式（补前导零）
                heartRate.setTimeLabel(DateUtils.convertMinutesToHHMM(minutes));
                heartRate.setValue(String.valueOf(rate));
                heartRateList.add(heartRate);
            }
            ringHeartRateInfoVO.setHeartRateList(heartRateList);
        }
        if(("2".equals(type) || "3".equals(type)) && list.size() > 0){
            List<RingHeartRateInfoVO.HeartRate> heartRateList = new ArrayList<>();
            for (RingHeartRateInfo heartRateInfo : list){
                String[] rateInfos = heartRateInfo.getHeartRateList().split(",");//转成String数组
                long everyDaySum = Stream.of(rateInfos).mapToInt(Integer::parseInt).sum();//计算一天总数
                sum += everyDaySum;//计算所有已测节点心率总数
                long everyDayCount = Stream.of(rateInfos).map(Integer::parseInt).filter(r -> r != 0 && r != 255).count();  // .collect(Collectors.toList());   一天多少测量节点
                count += everyDayCount;//计算所有已测节点总数
                String result = Stream.of(rateInfos)
                        .map(Integer::parseInt)                // 转换为整数
                        .filter(r -> r != 0 && r != 255)        // 过滤掉0和255
                        .sorted()                               // 从小到大排序
                        .map(String::valueOf)                   // 转换回字符串
                        .collect(Collectors.joining(","));
                RingHeartRateInfoVO.HeartRate heartRate = new RingHeartRateInfoVO.HeartRate();
                heartRate.setTimeLabel(queryWeekday(heartRateInfo.getHistoryDay(),type));
                heartRate.setValue(result);
                heartRateList.add(heartRate);
            }
            long value = sum/count;
            ringHeartRateInfoVO.setAverageValue((int)value);
            ringHeartRateInfoVO.setHeartRateList(heartRateList);
        }
        return ringHeartRateInfoVO;
    }

    public String queryWeekday(Date historyDay, String type) {
        String chineseDay = "";
        // 创建Calendar实例并设置时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(historyDay);
        if("2".equals(type)){
            // 获取星期几（1=周日，2=周一，...，7=周六）
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            // 中文星期数组（索引0对应周日，1对应周一...6对应周六）
            String[] chineseWeekdays = {"日", "一", "二", "三", "四", "五", "六"};
            // 根据星期数值获取对应的中文名称
            chineseDay = chineseWeekdays[dayOfWeek - 1];
        }
        if("3".equals(type)){
            // 获取当月的第几天（1-31）
            chineseDay = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
        }
        return chineseDay;
    }

}
